package br.com.senac.pi5.dao;

import br.com.senac.pi5.bean.Aeroporto;
import br.com.senac.pi5.bean.Voo;
import br.com.senac.pi5.connection.ConexaoDB;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;

public class VooDao {

    static PreparedStatement ps;
    // a conexão com o banco de dados
    private final Connection conexao;

    public VooDao(Connection conexao) {
        this.conexao = new ConexaoDB().getConexao();
    }

    public VooDao() {
        this.conexao = new ConexaoDB().getConexao();
    }

    public List<Voo> buscaVoos(Aeroporto origem, Aeroporto destino, String data) throws SQLException, ParseException {

        //Query de select do banco de dados para a busca de voos
        String sql = "select codigo, hr_chegada, hr_destino, duracao, origem, destino, vagas_econ, vagas_exec, to_char(data, 'DD/MM/YYYY') as data from voos where origem = '"
                + origem.getCodigo()
                + "' and destino = '" + destino.getCodigo() + "' and trunc(data) = TO_DATE('" + data + "','DD/MM/YYYY')";

        //preparando a conexão com o banco de dados
        PreparedStatement preparedStatement = conexao.prepareStatement(sql);
        ResultSet rs = preparedStatement.executeQuery(sql);

        //criando a lista de voos , com o resultado do banco.
        List<Voo> listaVoos = new ArrayList<>();

        while (rs.next()) {
            Voo voo = new Voo();
            voo.setCodigo(rs.getString("codigo"));
            voo.setData(rs.getString("data"));
            voo.setHr_chegada(rs.getString("hr_chegada"));
            voo.setHr_destino(rs.getString("hr_destino"));
            voo.setDuracao(rs.getString("duracao"));
            voo.setOrigem(origem);
            voo.setDestino(destino);
            voo.setLugaresEconomica(Integer.parseInt(rs.getString("vagas_econ")));
            voo.setLugaresExecutiva(Integer.parseInt(rs.getString("vagas_exec")));
            listaVoos.add(voo);
        }
        return listaVoos;
    }

    public Voo buscaVoo(String codigo) throws SQLException, ParseException {

        String sql = "select codigo, hr_destino, hr_chegada, duracao, origem, destino, vagas_econ, vagas_exec, to_char(data, 'DD/MM/YYYY') as data from voos where codigo = '" + codigo
                + "'";

        PreparedStatement preparedStatement = conexao.prepareStatement(sql);
        ResultSet rs = preparedStatement.executeQuery(sql);
        Voo voo = new Voo();

        while (rs.next()) {
            AeroportoDao dao = new AeroportoDao();
            voo.setCodigo(rs.getString("codigo"));
            voo.setData(rs.getString("data"));
            voo.setHr_chegada(rs.getString("hr_chegada"));
            voo.setHr_destino(rs.getString("hr_destino"));
            voo.setDuracao(rs.getString("duracao"));
            voo.setOrigem((dao.buscaAeroporto(rs.getString("origem"))));
            voo.setDestino((dao.buscaAeroporto(rs.getString("destino"))));
            voo.setLugaresEconomica(Integer.parseInt(rs.getString("vagas_econ")));
            voo.setLugaresExecutiva(Integer.parseInt(rs.getString("vagas_exec")));
        }
        return voo;
    }

    public void reservarLugares(String codigoVoo, Integer lugares, boolean isExecutivo) throws SQLException {

        String campo = isExecutivo ? "vagas_exec" : "vagas_econ";

        String sql = "select " + campo + " from voos where codigo = '" + codigoVoo + "'";

        PreparedStatement preparedStatement = conexao.prepareStatement(sql);
        ResultSet rs = preparedStatement.executeQuery(sql);
        Integer lugaresDisponiveis = null;
        while (rs.next()) {
            lugaresDisponiveis = Integer.parseInt(rs.getString(campo));
        }
        lugaresDisponiveis = lugaresDisponiveis - lugares;

        String sqlNovo = "update voos set " + campo + " = " + lugaresDisponiveis.toString() + " where codigo = '"
                + codigoVoo + "'";

        try (PreparedStatement stmt = conexao.prepareStatement(sqlNovo)) {
            stmt.execute();
            stmt.close();
        }
    }
}
